"""
1. __init__: 建立连接，获取游标
2. __del__：关闭游标，关闭连接
3. get_cursor：获取游标
4. get_one：查询一条记录
5. get_many: 获取多条记录，是获取，不是在里面打印
6. get_all: 获取所有记录，是获取，不是在里面打印
7. update_db: 执行数据库的更新操作，返回值为影响数据的行数
"""

import pymysql


class DBUtils(object):
    """数据库操作工具类"""

    def __init__(self, host="localhost", user="root", password="root",
                 database="books", port=3306, charset="utf8", autocommit=False):
        """建立连接，获取游标"""
        print('---------__init__----------')
        # 建立连接
        self.conn = pymysql.connect(host=host, user=user, password=password, database=database,
                                    port=port, charset=charset, autocommit=autocommit)
        # 获取游标
        self.cursor = self.conn.cursor()

    def __del__(self):
        print('---------__del__----------')

        # 关闭游标
        self.cursor.close()

        # 关闭连接
        self.conn.close()

    def get_cursor(self):
        """获取游标"""
        return self.cursor

    def get_one(self, sql):
        """查询一条记录"""
        # 执行sql语句
        self.cursor.execute(sql)
        # 获取数据
        one = self.cursor.fetchone()
        # 返回获取的数据
        return one

    def get_many(self, sql, size):
        """查询多条记录"""
        # 执行sql语句
        self.cursor.execute(sql)
        # 获取数据
        many = self.cursor.fetchmany(size)
        # 返回获取的数据
        return many

    def get_all(self, sql):
        """查询所有记录"""
        # 执行sql语句
        self.cursor.execute(sql)
        # 获取数据
        _all = self.cursor.fetchall()
        # 返回获取的数据
        return _all

    def update_db(self, sql):
        """执行数据库的更新操作"""
        # 执行sql语句
        n = self.cursor.execute(sql)
        # 提交事务
        self.conn.commit()
        # 返回 影响数据的行数
        return n


if __name__ == '__main__':
    # 创建对象
    dbobj = DBUtils(host='211.103.136.244', port=7061,
                       user='student', password='iHRM_student_2021',
                       database='test_db', charset='utf8')

    # 获取一条记录
    ret = dbobj.get_one("select id,title,`read`,`comment` from t_book;")
    print(ret)

    # 获取一条记录
    ret = dbobj.get_one("select id,title,`read`,`comment` from t_book;")
    print(ret)

    # 获取多条记录
    ret = dbobj.get_many("select * from t_book;", 2)
    print(ret)

    # 获取所有记录
    ret = dbobj.get_all("select * from t_book;")
    print(ret)

    # 插入数据
    ret = dbobj.update_db("insert into t_book(title, pub_date, `read`, `comment`) values('Python从入门到放弃', '1986-10-10', 333, 111);")
    print(ret)

    # 查询一条记录
    ret = dbobj.get_one("select * from t_book where title='Python从入门到放弃';")
    print(ret)

    # 更新
    ret = dbobj.update_db("update t_book set title='Python从小白到大神' where title='Python从入门到放弃';")
    print(ret)

    ret = dbobj.get_all("select * from t_book;")
    print(ret)

    # 删除
    ret = dbobj.update_db("delete from t_book where title='Python从小白到大神';")
    print(ret)

    ret = dbobj.get_all("select * from t_book;")
    print(ret)